
/**
 * 获取用户的坐标
 */
export function getCustomCoordinate(){
	return new Promise((resolv,reject) => {
		if(process.env.NODE_ENV === 'development') {
			resolv({longitude:39.02557,latitude:117.66887})
		}
		
		const success = function(latitude,longitude) {
			return {longitude,latitude}
		}
		uni.getLocation({
			type:'wgs84',
			timeout:2,
			success,
			fail:reject
		})
	})
}

/**
 * 动态获取后端地址
 */
const BASE_URL_MAP = {
	development:'http://localhost:3001',
	test:'http://localserver2',
	production:'https://www.baidu.com'
}
function getBaseUrl(){
	return BASE_URL_MAP[process.env.NODE_ENV]
}

export async function request(param,option){
	/**
	 * 参数合法检查
	 */
	if(typeof param !== 'object') throw new Error("that is why ts welcome to javascripter")
	
	const paramObject = JSON.parse(JSON.stringify(param))
	const {success,fail,header} = paramObject
	if(success || fail || header) throw new Error('请求中不能包含被封装的属性')
	
	/**
	 * 请求配置
	 * todo:认证信息
	 */
	paramObject.url = getBaseUrl() + paramObject.url
	paramObject.header = Object.assign({
		auth:uni.getStorageSync('token')
		// other
	},paramObject.header)
	
	
	const requestOption = Object.assign({
		loading:false,
		httpErrorTip:true,
		bussErrorTip:true,
		fullResponse:false
	},option)
	
	/**
	 * 发起请求和响应处理
	 */
	try{
		requestOption.loading && uni.showLoading({title:"加载中"})
		const response = await uni.request(paramObject)
		// todo:二进制流的响应
		const {data,statusCode} = response
		
		if(![401,200].includes(statusCode)){
			requestOption.httpErrorTip && uni.showToast({title:`错误${statusCode}`})
		}
		
		// 不是标准格式的响应
		if(!(data && data.code)) return data
		
		// 忽略响应数据的处理，将后端的全部响应数据给调用方
		if(requestOption.fullResponse) return data
		
		if(requestOption.bussErrorTip && data.code !== 200){
			uni.showToast({title:data.msg})
			return 
		}
		
		return data.data
	}catch(e){
		console.error(e.errMsg)
		requestOption.httpErrorTip && uni.showToast({
			title:e.errMsg
		})
	}finally{
		//todo:虽然不影响，但是这里会有控制台的警告
		uni.hideLoading()
		const {httpErrorTip,bussErrorTip} =  requestOption
		if(httpErrorTip || bussErrorTip) setTimeout(() => uni.hideToast() ,1000)
	}
}


/**
 * 仅仅在开发的时候使用，用来生成假数据，用来开发页面
 */
const idList = (() => {
	const list = []
	for(let i = 0; i < 50;i++){
		list.push(Math.random().toString(36).slice(-8))
	}
	return list
})()
export function randomStr(length = 8, keyIndex){
	if(typeof keyIndex === 'number'){
		return idList[keyIndex]
	}
	return Math.random().toString(36).slice(-length)
}